package com.zp.self.module.level_4_算法练习.数学.数学推理;

import org.junit.Test;

/**
 * @author By ZengPeng
 */
public class 力扣_152_乘积最大子数组 {
    @Test
    public void main() {

        System.out.println(maxProduct(new int[]{2,3,-2,4}));//6
        System.out.println(maxProduct(new int[]{2,3,-2,4,-1})); //48
        System.out.println(maxProduct(new int[]{2,3,-1,2,4}));//8
        System.out.println(maxProduct(new int[]{-2,0,-1}));//0
        System.out.println(maxProduct(new int[]{2,-5,-2,-4,3}));//24
        System.out.println(maxProduct(new int[]{2,-5,-2,4,-1,-9,3}));//24
    }

    /**
    题目：给你一个整数数组 nums ，请你找出数组中乘积最大的非空连续子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。
          测试用例的答案是一个 32-位 整数。
          子数组 是数组的连续子序列。

     示例 1:
     输入: nums = [2,3,-2,4]
     输出: 6
     解释: 子数组 [2,3] 有最大乘积 6。

     示例 2:
     输入: nums = [-2,0,-1]
     输出: 0
     解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

    分析：【BR 💔💔💔💔】
       大神.前后两次遍历： 数组被0分割，求每一部分的最大值
                1.有偶数个数负时，最大值为累积
                2.有奇数个数负时，左边开始统计的最大值，与右边开始的最大值  ，中选一个最大值
            如果当值值为0 ；则当前乘积要初始化 cur=1
                --执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户
                --时长：∞

    边界值 & 注意点：
       1.[2,-5,-2,-4,3]
     **/
    public int maxProduct(int[] nums) {
        int  max=nums[0],cur=1,length=nums.length;
        for (int num : nums) {
            cur*=num;
            max = Math.max(max,cur);
            if(num==0) cur=1;
        }
        cur=1;
        for (int i = nums.length-1; i >=0; i--) {
            cur*=nums[i];
            max = Math.max(max,cur);
            if(nums[i]==0) cur=1;
        }
        return max;
    }
}
